#include "conjunto_de_descriptores.h"

#include <iostream>

ConjuntoDeDescriptores::ConjuntoDeDescriptores() {
	this->descriptores = new Lista<DescriptorAlumno>;
}

ConjuntoDeDescriptores::~ConjuntoDeDescriptores() {
	delete this->descriptores;
}

ConjuntoDeDescriptores::ConjuntoDeDescriptores(const ConjuntoDeDescriptores &otroConjunto) {
	this->descriptores = new Lista<DescriptorAlumno>;
	IteradorLista<DescriptorAlumno> iterador = otroConjunto.descriptores->iterador();
	while(iterador.tieneSiguiente()){
		this->agregarDescriptor(iterador.siguiente());
	}
}

ConjuntoDeDescriptores& ConjuntoDeDescriptores::operator=(const ConjuntoDeDescriptores &otroConjunto) {
	if(&otroConjunto != this){
		IteradorConjuntoDeDescriptores unIterador = this->iterador();
		while(unIterador.tieneSiguiente()){
			this->quitarDescriptor(unIterador.siguiente());
		}

		IteradorLista<DescriptorAlumno> otroIterador = otroConjunto.descriptores->iterador();
		while(otroIterador.tieneSiguiente()){
			this->agregarDescriptor(otroIterador.siguiente());
		}
	}
	return *this;
}


void ConjuntoDeDescriptores::agregarDescriptor(DescriptorAlumno nuevoDescriptor) {
	/**
	 * Si el elemento ya esta en el conjunto no se hace nada.
	 */
	IteradorConjuntoDeDescriptores iterador = this->iterador();
	while(iterador.tieneSiguiente()){
		if(nuevoDescriptor == iterador.siguiente()){
			return;
		}
	}

	this->descriptores->agregar(nuevoDescriptor);
}

void ConjuntoDeDescriptores::quitarDescriptor(DescriptorAlumno descriptor) {
	std::cerr << "---" << descriptor << std::endl;

	IteradorLista<DescriptorAlumno> iterador = this->descriptores->iterador();
	while(iterador.tieneSiguiente()){
		if(descriptor == iterador.get()){
			std::cerr << iterador.remover() << std::endl;
		}else{
			iterador.siguiente();
		}
	}
}

IteradorConjuntoDeDescriptores ConjuntoDeDescriptores::iterador() {
	IteradorConjuntoDeDescriptores elIterador(this->descriptores);
	return elIterador;
}

int ConjuntoDeDescriptores::tamanio() {
	return this->descriptores->tamanio();
}
